# 文件处理

# 打开文件并读取内容
from tkinter import N


def read_file(file):
    # with 我们不需要显式调用该close()方法。它是在内部完成的。
    with open(file, 'r') as f: # 打开文件并读取内容, 以只读模式打开, 并将文件对象赋值给f
        content = f.read() # 读取文件内容, 并将内容赋值给content变量
        print(content) # 打印文件内容
        return content # 返回文件内容


# 打开文件并写入内容
def write_file1(file):
    try:
        f = open(file, 'w', encoding = 'utf-8') # 打开文件并写入内容, 以写入模式打开, 并将文件对象赋值给f
        f.write("my first file\n")
        f.write("This file\n\n")
        f.write("contains three lines\n")
        print("文件写入成功", f) # 打印文件写入成功
    finally: # 无论是否抛出异常, 都会执行finally块中的代码
        f.close() # 关闭文件, 释放资源

def write_file(file, content):
    with open(file, 'w') as f: # 打开文件并写入内容, 以写入模式打开, 并将文件对象赋值给f
        f.write(content) # 写入内容到文件中
        # print("文件写入成功", content) # 打印文件写入成功

# 打开文件并追加内容
def append_file(file, content):
    with open(file, 'a') as f: # 打开文件并追加内容, 以追加模式打开, 并将文件对象赋值给f
        f.write(content) # 写入内容到文件中
        # print("文件追加成功", content) # 打印文件追加成功

# 打开文件并读取行
def read_lines(file):
    with open(file, 'r') as f: # 打开文件并读取行, 以只读模式打开, 并将文件对象赋值给f
        lines = f.readlines() # 读取文件内容, 并将内容赋值给lines变量
        print(lines) # 打印文件内容
        return lines # 返回文件内容

# 打开文件并读取行, 并将行内容存储到列表中, 并返回列表
def read_lines_list(file):
    with open(file, 'r') as f: # 打开文件并读取行, 以只读模式打开, 并将文件对象赋值给f
        lines = f.readlines() # 读取文件内容, 并将内容赋值给lines变量
        print(lines) # 打印文件内容
        return lines # 返回文件内容

# 打开文件写入并读取，输出
def write_read_file(file, content):
    with open(file, 'w') as f: # 打开文件并写入内容, 以写入模式打开, 并将文件对象赋值给f
        f.write(content) # 写入内容到文件中
        # print("文件写入成功", content) # 打印文件写入成功
    with open(file, 'r') as f: # 打开文件并读取行, 以只读模式打开, 并将文件对象赋值给f
        lines = f.readline() # 读取文件内容, 并将内容赋值给lines变量
        print(lines) # 打印文件内容
        return lines # 返回文件内容

# 用 r+ 的方式打开文件，读写文件
def read_write_file(file, content):
    with open(file, 'r+') as f: # 打开文件并写入内容, 以读写模式打开, 并将文件对象赋值给f
        f.write(content) # 写入内容到文件中
        # print("文件写入成功", content) # 打印文件写入成功
    with open(file, 'r+') as f: # 打开文件并读取行, 以读写模式打开, 并将文件对象赋值给f
        lines = f.readline() # 读取文件内容, 并将内容赋值给lines变量
        print(lines) # 打印文件内容
        return lines # 返回文件内容


import os # 导入os模块, 用于操作文件和目录
# 检查文件是否存在, 并返回文件大小, 最后修改时间, 最后访问时间, 最后修改时间
def check_file(file):
    if os.path.exists(file): # 检查文件是否存在, 并将结果赋值给exists变量
        print("文件存在") # 打印文件存在
        print("文件大小: ", os.path.getsize(file)) # 打印文件大小, 单位为字节, 输出: 文件大小:  20
        print("最后修改时间: ", os.path.getmtime(file)) # 打印最后修改时间, 单位为秒, 输出: 最后修改时间:  1628555200.0
        print("最后访问时间: ", os.path.getatime(file)) # 打印最后访问时间, 单位为秒, 输出: 最后访问时间:  1628555200.0


def create_subdirectory(path):
    os.makedirs(path, exist_ok=True)
    print(f"已创建目录：{path}")


def create_nested_files(directory, filename, content):
    os.makedirs(directory, exist_ok=True)
    file_path = os.path.join(directory, filename)
    with open(file_path, 'w') as f:
        f.write(content)
    print(f"已创建文件：{file_path}")



# 内置异常，和自定义异常
# 内置异常：Python 内置了一些异常类，如 ValueError、TypeError、FileNotFoundError 等。这些异常类都是从 Exception 类继承而来的。
# 自定义异常：我们也可以自定义异常类，继承自 Exception 类。自定义异常类可以用于表示特定的错误情况，例如：
# [https://www.cainiaojc.com/python/python-user-defined-exception.html]